Software containers have emerged to address the increasing portability needs of software applications. A container bundles an application and all its dependencies and libraries into an isolated, resource controlled and easy-to-deploy building block that can run on any operating system in any computing environment. Containers can be deployed on either physical or virtual machines in private, public or hybrid clouds, thereby facilitating workload management of large scale applications. Multiple containers can run on a single machine and share the operating system kernel, while keeping processes and resources such as memory, CPU and disks isolated from each other. This makes container deployment efficient, fast and lightweight.
There are several popular container development and management systems available, such as for example. Docker, Rocket and Kubernetes. These systems include tools for creating and running container images, which are the files that make up the applications that run inside a container. Image files contain all the requirements for running a single container, as well as metadata delineating information and attributes associated with the container.
System administrators can use container orchestration engines to manage and schedule the allocation and deployment of containers to a server or cluster of servers. Container orchestration engines such as Kubernetes and Docker Swarm provide basic scheduling capabilities, focusing mainly on CPU, memory and storage requirements. Poor management and scheduling of containers can lead to an inefficient utilization of underlying resources and a mismatch between workloads and resources.